import {createNamespace} from '../../utils';
import Stepper from '../../stepper';
import {LIMIT_TYPE} from '../constants';

var namespace = createNamespace('sku-stepper');
var createComponent = namespace[0];
var t = namespace[2];
var QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT,
    STOCK_LIMIT = LIMIT_TYPE.STOCK_LIMIT;
export default createComponent({
    props: {
        stock: Number,
        skuEventBus: Object,
        skuStockNum: Number,
        selectedNum: Number,
        stepperTitle: String,
        disableStepperInput: Boolean,
        customStepperConfig: Object,
        hideQuotaText: Boolean,
        quota: {
            type: Number,
            default: 0
        },
        quotaUsed: {
            type: Number,
            default: 0
        },
        startSaleNum: {
            type: Number,
            default: 1
        }
    },
    data: function data() {
        return {
            currentNum: this.selectedNum,
            // 购买限制类型: 限购/库存
            limitType: STOCK_LIMIT
        };
    },
    watch: {
        currentNum: function currentNum(num) {
            var intValue = parseInt(num, 10);

            if (intValue >= this.stepperMinLimit && intValue <= this.stepperLimit) {
                this.skuEventBus.$emit('sku:numChange', intValue);
            }
        },
        stepperLimit: function stepperLimit(limit) {
            if (limit < this.currentNum && this.stepperMinLimit <= limit) {
                this.currentNum = limit;
            }

            this.checkState(this.stepperMinLimit, limit);
        },
        stepperMinLimit: function stepperMinLimit(start) {
            if (start > this.currentNum || start > this.stepperLimit) {
                this.currentNum = start;
            }

            this.checkState(start, this.stepperLimit);
        }
    },
    computed: {
        stepperLimit: function stepperLimit() {
            var quotaLimit = this.quota - this.quotaUsed;
            var limit; // 无限购时直接取库存，有限购时取限购数和库存数中小的那个

            if (this.quota > 0 && quotaLimit <= this.stock) {
                // 修正负的limit
                limit = quotaLimit < 0 ? 0 : quotaLimit;
                this.limitType = QUOTA_LIMIT;
            } else {
                limit = this.stock;
                this.limitType = STOCK_LIMIT;
            }

            return limit;
        },
        stepperMinLimit: function stepperMinLimit() {
            return this.startSaleNum < 1 ? 1 : this.startSaleNum;
        },
        quotaText: function quotaText() {
            var _this$customStepperCo = this.customStepperConfig,
                quotaText = _this$customStepperCo.quotaText,
                hideQuotaText = _this$customStepperCo.hideQuotaText;
            if (hideQuotaText) return '';
            var text = '';

            if (quotaText) {
                text = quotaText;
            } else {
                var textArr = [];

                if (this.startSaleNum > 1) {
                    textArr.push(t('quotaStart', this.startSaleNum));
                }

                if (this.quota > 0) {
                    textArr.push(t('quotaLimit', this.quota));
                }

                text = textArr.join(t('comma'));
            }

            return text;
        }
    },
    created: function created() {
        this.checkState(this.stepperMinLimit, this.stepperLimit);
    },
    methods: {
        setCurrentNum: function setCurrentNum(num) {
            this.currentNum = num;
            this.checkState(this.stepperMinLimit, this.stepperLimit);
        },
        onOverLimit: function onOverLimit(action) {
            this.skuEventBus.$emit('sku:overLimit', {
                action: action,
                limitType: this.limitType,
                quota: this.quota,
                quotaUsed: this.quotaUsed,
                startSaleNum: this.startSaleNum
            });
        },
        onChange: function onChange(currentValue) {
            var intValue = parseInt(currentValue, 10);
            var handleStepperChange = this.customStepperConfig.handleStepperChange;
            handleStepperChange && handleStepperChange(intValue);
            this.$emit('change', intValue);
        },
        checkState: function checkState(min, max) {
            // 如果选择小于起售，则强制变为起售
            if (this.currentNum < min || min > max) {
                this.currentNum = min;
            } else if (this.currentNum > max) {
                // 当前选择数量大于最大可选时，需要重置已选数量
                this.currentNum = max;
            }

            this.skuEventBus.$emit('sku:stepperState', {
                valid: min <= max,
                min: min,
                max: max,
                limitType: this.limitType,
                quota: this.quota,
                quotaUsed: this.quotaUsed,
                startSaleNum: this.startSaleNum
            });
        }
    },
    render: function render() {
        var _this = this;

        var h = arguments[0];
        return h("div", {
            "class": "van-sku-stepper-stock"
        }, [h("div", {
            "class": "van-sku-stepper-container"
        }, [h("div", {
            "class": "van-sku__stepper-title"
        }, [this.stepperTitle || t('num')]), h(Stepper, {
            "class": "van-sku__stepper",
            "attrs": {
                "min": this.stepperMinLimit,
                "max": this.stepperLimit,
                "disableInput": this.disableStepperInput,
                "integer": true
            },
            "on": {
                "overlimit": this.onOverLimit,
                "change": this.onChange
            },
            "model": {
                value: _this.currentNum,
                callback: function callback($$v) {
                    _this.currentNum = $$v;
                }
            }
        }), !this.hideQuotaText && this.quotaText && h("span", {
            "class": "van-sku__stepper-quota"
        }, ["(", this.quotaText, ")"])])]);
    }
});